package com.device.service.impl;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; // 新增 Hutool JSON 工具类导入
import com.device.service.IMapService;
import com.share.common.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class MapServiceImpl implements IMapService {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${tencent.map.key}")
    private String key;

    @Override
    public JSONObject calculateLatLng(String keyword) {
        String url = "https://apis.map.qq.com/ws/geocoder/v1/?address={address}&key={key}";
        Map<String, String> params = new HashMap<>();
        params.put("address", keyword);
        params.put("key", key);

        // 打印请求参数
        log.info("调用腾讯地图API，参数：address={}", keyword);
        log.info("当前使用的腾讯地图Key前5位：{}", key != null ? key.substring(0, 5) : "null");
        // 发送请求并处理响应
        JSONObject response = restTemplate.getForObject(url, JSONObject.class, params);

        // 1. 校验响应是否为空（防止网络异常返回null）
        if (response == null) {
            log.error("腾讯地图API无响应，参数：{}", params);
            throw new ServiceException("地图服务无有效响应");
        }

        // 2. 打印完整响应（格式化JSON）
        log.info("腾讯地图API响应：\n{}", JSONUtil.toJsonPrettyStr(response));

        // 3. 校验状态码并获取详细错误信息
        int status = response.getInt("status", -1); // 若status不存在，默认-1
        String errorMsg = response.getStr("message", "未知错误");
        if (status != 0) {
            log.error("腾讯地图API调用失败，status={}, message={}", status, errorMsg);
            throw new ServiceException("地图解析异常：status=" + status + ", 原因=" + errorMsg);
        }

        // 4. 校验result和location字段（避免后续空指针）
        JSONObject result = response.getJSONObject("result");
        if (result == null) {
            log.error("响应中缺少result字段，响应：{}", response.toString());
            throw new ServiceException("地图解析结果缺失");
        }

        JSONObject location = result.getJSONObject("location");
        if (location == null) {
            log.error("响应中缺少location字段，响应：{}", response.toString());
            throw new ServiceException("地图位置信息缺失");
        }

        // 打印格式化后的结果（使用Hutool工具类）
        log.info("解析成功，位置信息：\n{}", JSONUtil.toJsonPrettyStr(location));

        return location;
    }
/*
* 计算距离
* */
    @Override
    public Double calculateDistance(String startLongitude, String startLatitude, String endLongitude, String endLatitude) {
//        //首先需要引入腾讯地图的坐标转换工具类
//        String url = "https://apis.map.qq.com/ws/direction/v1/walking/?from={from}&to={to}&key={key}";
//        //创建一个map集合，用于封装请求参数存的是，当前人的位置和终点的位置
//        HashMap<String, String> objectObjectHashMap = new HashMap<>();
//        objectObjectHashMap.put("from", startLatitude + "," + startLongitude);
//        objectObjectHashMap.put("to", endLatitude + "," + endLongitude);
//        objectObjectHashMap.put("key", key);
//
//        //调用地图服务的API
//        JSONObject response = restTemplate.getForObject(url, JSONObject.class, objectObjectHashMap);
//        if (response.getInt("status")!=0) {
//            throw new ServiceException("地图服务调用失败");
//        }
//        //返回一条最佳路线
//        JSONObject route = response.getJSONObject("result").getJSONArray("routes").getJSONObject(0);
//        //返回这个路线的总距离（单位为米）
//        return route.getDouble("distance").doubleValue();

        Random random = new Random();
        BigDecimal randomDouble = BigDecimal.valueOf(random.nextDouble(100));

        // 保留两位小数，并进行四舍五入
        BigDecimal roundedValue = randomDouble.setScale(1, RoundingMode.HALF_UP);
        return roundedValue.doubleValue();
    }

    // 可选：配置RestTemplate超时（建议在配置类中统一设置）
    @Autowired
    public void configureRestTemplate(RestTemplate restTemplate) {
        SimpleClientHttpRequestFactory factory = (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory();
        if (factory != null) {
            factory.setConnectTimeout(5000); // 连接超时5秒
            factory.setReadTimeout(10000); // 读取超时10秒
        }
    }
}